package team.api;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import study.itwill.common.DBHandler;
import team.item.Health_typeItem;

/**
 * CRUD 처리를 하는 클래스 만들기
 * --------------------------------------------
 * 데이터 입출력이 필요한 기능에 대하여,
 * CREATE, READ, UPDATE, DELETE에 해당하는 메서드를
 * 구현해 놓는 처리를 말한다.
 * --------------------------------------------
 * CREATE 	--> SQL의 INSERT 구문을 실행한다.
 * READ 	--> SQL의 SELECT 구문을 실행한다.
 * UPDATE 	--> SQL의 UPDATE 구문을 실행한다.
 * DELETE 	--> SQL의 DELETE 구문을 실행한다.
 * --------------------------------------------
 * CRUD에 해당하는 기능들은 어떤 데이터 처리를 목적으로
 * 하는지가 정해져야 한다.
 * ex) 학생 데이터의 입출력 
 *     교수 데이터의 입출력 
 *     회원 데이터의 입출력
 *     게시물 데이터의 입출력
 *     카테고리 데이터의 입출력
 *     상품 데이터의 입출력 
 * --------------------------------------------
 * 메서드들의 이름은 "동사" + "목적어" 형식으로 작성한다.
 * ex) 학생 데이터의 입출력인 경우
 * 		--> insertHealth_type, updateHealth_type, deleteHealth_type, 
 *          selectHealth_type
 * --------------------------------------------
 * insert 기능의 경우, 각 데이터를 판별할 수 있는
 * 고유한 값(PK)를 제외하고 INSERT에 처리한 모든 값들을 
 * 메서드 파라미터로 전달받아야 한다.
 * 데이터 형은 테이블 구조를 참조하면 된다. 
 * 
 * 메서드의 수행 결과는 새롭게 추가된 데이터의 일련번호(seq)
 * 를 리턴해 주어야 한다.
 * --------------------------------------------
 * update, delete의 경우 결과를 리턴해 주어야 한다.
 * --> boolean 값을 리턴한다.
 * 
 * UPDATE, DELETE는 각 데이터를 판별할 수 있는 
 * 고유한 값(PK)를 파라미터로 전달 받는다.
 * 그 외에 추가적으로 일괄 삭제나, 일괄 수정등을 
 * 목적으로 할 경우 상황에 따라 파라미터 형태를 
 * 변경할 수 있다.
 * --------------------------------------------
 * 이 클래스들은 DATABASE 접속이 성공 한 이후에
 * 호출된다고 가정되어야 한다.
 */

public class Health_type {
	
	static Logger logger = Logger.getLogger(Health_type.class);
	
	private static final String TABLE = "Health_type";
	
	public int insertHealth_type(String health2_name, 
		 int Health_seq) {
		
		//---------------------------------------------
		// 메서드 시작
		//---------------------------------------------
		logger.debug("=========== method start >> insertHealth_type");
		logger.debug("[PARAMS] health2_name=" + health2_name);
		
		logger.debug("[PARAMS] Health_seq=" + Health_seq);
	
		// 리턴할 값 선언
		
		
		// SQL 인젝션 방어
		health2_name = health2_name.replace("'", "\'");
		
	
		
		//---------------------------------------------
		// 로직 구현
		//---------------------------------------------
		// 테이블이 자동 증가가 아니므로,
		// 최대값 + 1 형식으로 메서드 안에서 생성한다.
		
		
		
		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();
		
		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO Health_type("
				+ "health2_name,reg_date,edit_date,Health_seq"
				+ ") VALUES ("
				+ "'%s',now(),now(), %d);";
		
		boolean result = DBHandler.execSql(sql, health2_name,				
				Health_seq);
		int seq =-1;
		
		
		//---------------------------------------------
		// 결과처리
		//---------------------------------------------
		if (result) {
		
			DBHandler.commit();
			 seq = DBHandler.getMax(TABLE, 
					"seq", null);
			logger.debug("처리결과 >> " + seq 
					+ "번 학생 등록 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 추가 실패");
		}
		
		logger.debug("=========== method end >> insertHealth_type");
		
		return seq;
	}

	public boolean updateHealth_type(int seq, 
			String health2_name, String edit_date,int Health_seq) {
		
		// ---------------------------------------------
		// 메서드 시작
		// ---------------------------------------------
		logger.debug("=========== method start >> updateHealth_type");
		logger.debug("[PARAMS] seq=" + seq);
		logger.debug("[PARAMS] health2_name=" + health2_name);

		logger.debug("[PARAMS] edit_date=" + edit_date);
		logger.debug("[PARAMS] Health_seq=" + Health_seq);
		
		// 리턴할 값 선언
		boolean result = false;

		// SQL 인젝션 방어
		health2_name = health2_name.replace("'", "\'");
	
		edit_date = edit_date.replace("'", "\'");
		
				
		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();

		// INSERT 처리를 위한 구현
		String sql = "UPDATE Health_type SET "
				+ "health2_name='%s',"				
				+ "edit_date=now(),"
				+ "Health_seq=%d "
				+ "WHERE seq=%d";

		result = DBHandler.execSql(sql, health2_name,  edit_date,
				Health_seq, seq);
		
		// ---------------------------------------------
		// 결과처리
		// ---------------------------------------------
		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 학생 수정 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 수정 실패");
		}

		logger.debug("=========== method end >> updateHealth_type");

		return result;
	}

	public boolean deleteHealth_type(int seq) {
		logger.debug("=========== method start >> deleteHealth_type");
		logger.debug("[PARAMS] seq=" + seq);
		
		boolean result = false;
		
		DBHandler.beginTrans();
		
		String sql = "DELETE FROM Health_type WHERE seq=%d";
		result = DBHandler.execSql(sql, seq);
		
		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 학생 삭제 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 삭제 실패");
		}
				
		logger.debug("=========== method end >> deleteHealth_type");
		return result;
	}
	
	/**
	 * 학생 한명의 데이터를 조회하여 리턴하는 메서드
	 * @param seq
	 * @return Health_typeItem
	 */
	public Health_typeItem selectHealth_type(int seq) {
		logger.debug("=========== method start >> selectHealth_type");
		logger.debug("[PARAMS] seq=" + seq);
		
		Health_typeItem item = null;
		
		// 데이터 조회
		String sql = "SELECT seq, health2_name, reg_date, edit_date, "
				+ "Health_seq "
				+ "FROM Health_type WHERE seq=%d";
		
		ResultSet rs = DBHandler.getResult(sql, seq);
		
		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();
				
				// 1) ResultSet의 모든 데이터를 변수로 추출
				int seqq = rs.getInt(1);
				String health2_name = rs.getString(2);
				String reg_date = rs.getString(3);
				String edit_date = rs.getString(4);
				int Health_seq = rs.getInt(5);
				
				
				// 2) 추출된 값을 객체로 구성
				item = new Health_typeItem(seqq, health2_name, reg_date, edit_date, 
						Health_seq);
				
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if ( item == null ) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}
		
		logger.debug("=========== method end >> selectHealth_type");
		
		return item;
	}
	
	/**
	 * 학생목록의 데이터를 조회하여 리턴하는 메서드
	 * @param seq
	 * @return ArrayList<Health_typeItem>
	 */
	public ArrayList<Health_typeItem> selectHealth_typeList(int p_grade) {
		logger.debug("=========== method start >> selectHealth_typeList");
		
		ArrayList<Health_typeItem> list = null;
		
		// 데이터 조회
		String sql = "SELECT seq, health2_name, reg_date, edit_date, "
				+ "Health_seq "
				+ "FROM Health_type";
		
		// 파라미터에 따라서 검색조건 지정
		if (p_grade > 0) {
			sql += " WHERE grade='" + p_grade + "'";
		}
		
		ResultSet rs = DBHandler.getResult(sql);
		
		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				
				list = new ArrayList<Health_typeItem>();
				
				while (rs.next()) {
					
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int seqq = rs.getInt(1);
					String health2_name = rs.getString(2);
					String reg_date = rs.getString(3);
					String edit_date = rs.getString(4);
					int Health_seq = rs.getInt(5);
					
					// 2) 추출된 값을 객체로 구성
					Health_typeItem item = new Health_typeItem(seqq, health2_name, reg_date,
							edit_date, Health_seq);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if ( list == null ) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}
		
		logger.debug("=========== method end >> selectHealth_typeList");
		
		return list;
	}
	
	
	
}












